package config

import (
	"errors"
	"fmt"
	"github.com/spf13/viper"
	"os"
)

var Conf *Config

type Config struct {
	ApiPort    int         `yaml:"apiPort"`
	LogName    string      `yaml:"logName"`
	LogLv      string      `yaml:"logLv"`
	ShowSqlLog bool        `yaml:"showSqlLog"`
	Platform   string      `yaml:"platform"` //平台根路由
	DB         string      `yaml:"db"`       // 数据库类型
	Sqlite     DBConfig    `yaml:"sqlite"`   // SQLITE配置
	MySql      DBConfig    `yaml:"mySql"`    // MYSQL配置
	PgSql      DBConfig    `yaml:"pgSql"`    // PGSQL配置
	Redis      CacheConfig `yaml:"redis"`    // REDIS配置
	Smtp       SmtpConfig  `yaml:"smtp"`     // SMTP配置
	AES        AESConfig   `yaml:"aes"`      // AES配置
	RSA        RSAConfig   `yaml:"rsa"`      // RES配置
}

type DBConfig struct {
	MaxIdleConns int      `yaml:"maxIdleConns"` // 最大空闲连接数
	MaxOpenConns int      `yaml:"maxOpenConns"` // 最大打开连接数
	Sources      []string `yaml:"sources"`      // 读集群
	Replicas     []string `yaml:"replicas"`     // 写集群
}

type CacheConfig struct {
	Addr         []string `yaml:"addr"`         // 缓存集群
	Password     string   `yaml:"password"`     // 密码
	DB           int      `yaml:"db"`           // 使用DB
	Prefix       string   `yaml:"prefix"`       // 使用前缀
	MinIdleConns int      `yaml:"minIdleConns"` // 最小空闲连接数
	PoolSize     int      `yaml:"poolSize"`     // 最大连接数
}

type SmtpConfig struct {
	Host     string `yaml:"host"`     // SMTP主机
	Account  string `yaml:"account"`  // 账号
	Password string `yaml:"password"` // 密码
	Display  string `yaml:"display"`  // 显示名
	From     string `yaml:"from"`     // 来自
}

type AESConfig struct {
	Key string `yaml:"key"` // AES KEY
	IV  string `yaml:"iv"`  // AES IV
}

type RSAConfig struct {
	PubKey string `yaml:"pubkey"` // RSA 公KEY
	PriKey string `yaml:"prikey"` // RSA 私KEY
}

func initConfig(configName string) (isWrite bool, v *viper.Viper) {
	v = viper.New()
	v.SetConfigType("yaml")
	v.SetConfigName(configName)
	v.AddConfigPath(".")
	lc := &Config{}
	isWrite = false
	err := v.Unmarshal(lc)
	if err != nil {
		fmt.Println(err)
		if errors.Is(err, os.ErrNotExist) {
			isWrite = true
		}
	}
	Conf = lc
	if Conf.DB == "" {
		Conf.DB = "sqlite"
		isWrite = true
	}
	if Conf.LogLv == "" {
		Conf.LogLv = "info"
		isWrite = true
	}
	if Conf.LogName == "" {
		Conf.LogName = "miao.log"
		isWrite = true
	}
	if len(Conf.Sqlite.Sources) == 0 {
		Conf.Sqlite.Sources = []string{"./data/miao.db"}
		isWrite = true
	}
	return isWrite, v
}
